import pandas as pd

# 读取csv文件
df = pd.read_csv('order_train1.csv')

# 查看DataFrame的行数
num_rows = df.shape[0]
print("DataFrame的行数为：", num_rows)

# 检查是否有缺失值
if df.isnull().sum().sum() > 0:
    print('数据集中存在缺失值')
else:
    print('数据集中不存在缺失值')

# 检查是否有重复值
if df.duplicated().sum() > 0:
    print('数据集中存在重复值')
else:
    print('数据集中不存在重复值')

# 删除所有列的重复值，只保留第一次出现的数据
df.drop_duplicates(keep='first', inplace=True)

# 查找整行重复的数据
duplicate_rows = df[df.duplicated(keep=False)]

# 输出整行重复的数据
if len(duplicate_rows) > 0:
    print("整行重复数据：")
    print(duplicate_rows)
else:
    print("不存在整行重复数据。")

# 查看DataFrame的行数
num_rows = df.shape[0]
print("删除重复数据后DataFrame的行数为：", num_rows)

# 将处理后的数据保存为新的CSV文件
df.to_csv('order_train1.csv', index=False)

# 处理异常值
# 读取数据
df = pd.read_csv('order_train1.csv', parse_dates=['order_date'])
# 假设数据中有一列为'order_date'，代表销售日期，一列为'ord_qty'，表示当日需求量
# 数据中可能存在缺失值或空值，需要进行清洗和预处理

# 创建时间序列索引
df.set_index('order_date', inplace=True)

# 人为设置条件筛选异常值
outliers = df[(df['ord_qty'] < 0) | (df['ord_qty'] > 6000)]

# 输出异常值的具体日期及其对应的销售量
print('The outliers and their corresponding dates, product codes and sales are:')
for index, row in outliers.iterrows():
    print(index.date(), row['ord_qty'])

# 删除异常值
# 读取csv文件
df = pd.read_csv('order_train1.csv')

# 按条件选择需要检查的列
check_cols = ['order_date', 'ord_qty']

# 删除所有超出异常值范围的行，并保存包含 order_date 的 DataFrame 到新文件中
new_df = df[(df['ord_qty'] >= 0) & (df['ord_qty'] <= 6000)]
new_df.to_csv('order_train1_new.csv', index=False)

print("Done!")

# 对新文件进行校验
# 读取数据
df = pd.read_csv('order_train1_new.csv', parse_dates=['order_date'])
# 假设数据中有一列为'order_date'，代表销售日期，一列为'ord_qty'，表示当日需求量
# 数据中可能存在缺失值或空值，需要进行清洗和预处理

# 创建时间序列索引
df.set_index('order_date', inplace=True)

# 人为设置条件筛选异常值
outliers = df[(df['ord_qty'] < 0) | (df['ord_qty'] > 6000)]
if outliers.empty:
    print("异常值清理完毕！！")
else:
    # 输出异常值的具体日期及其对应的销售量
    print('The outliers and their corresponding dates, product codes and sales are:')
    for index, row in outliers.iterrows():
        print(index.date(), row['ord_qty'])

# 合法性检查

# 读取数据集
df = pd.read_csv('order_train1_new.csv')

# 检查数据类型是否正确
print(df.dtypes)

# 检查日期格式是否正确
df['order_date'] = pd.to_datetime(df['order_date'], format='%Y-%m-%d', errors='coerce')
print(df['order_date'].isnull().sum())

# 检查各种编码
print(df[df['sales_region_code'] <= 0])
print(df[df['item_code'] <= 0])

print(df[df['first_cate_code'] <= 0])
print(df[df['second_cate_code'] <= 0])

# 筛选出Column1列中数据不为offline或online的行
filtered_df = df[~ df['sales_chan_name'].isin(['offline', 'online'])]
print(filtered_df)

# 检查产品价格和订单需求量是否大于零
print(df[df['item_price'] <= 0])
print(df[df['ord_qty'] <= 0])